home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2006 May / PCWMAY06.iso / Software / Toolkit / Songbird 0.1 / Songbird_0_1_0.exe / components / sbIPlaylistReaderManager.js < prev    next >
Encoding:
Text File  |  2006-02-08  |  13.1 KB  |  392 lines

  1. /*
  2.  //
  3. // BEGIN SONGBIRD GPL
  4. // 
  5. // This file is part of the Songbird web player.
  6. //
  7. // Copyright⌐ 2006 Pioneers of the Inevitable LLC
  8. // http://songbirdnest.com
  9. // 
  10. // This file may be licensed under the terms of of the
  11. // GNU General Public License Version 2 (the ôGPLö).
  12. // 
  13. // Software distributed under the License is distributed 
  14. // on an ôAS ISö basis, WITHOUT WARRANTY OF ANY KIND, either 
  15. // express or implied. See the GPL for the specific language 
  16. // governing rights and limitations.
  17. //
  18. // You should have received a copy of the GPL along with this 
  19. // program. If not, go to http://www.gnu.org/licenses/gpl.html
  20. // or write to the Free Software Foundation, Inc., 
  21. // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  22. // 
  23. // END SONGBIRD GPL
  24. //
  25.  */
  26.  
  27. //
  28. // sbIPlaylistReaderManager Object
  29. // 
  30.  
  31. const SONGBIRD_PLAYLISTREADERMANAGER_CONTRACTID = "@songbird.org/Songbird/PlaylistReaderManager;1";
  32. const SONGBIRD_PLAYLISTREADERMANAGER_CLASSNAME = "Songbird Playlist Reader Manager Interface"
  33. const SONGBIRD_PLAYLISTREADERMANAGER_CID = Components.ID('{18032AD6-CB1F-403d-B3F5-7FE8EB579C28}');
  34. const SONGBIRD_PLAYLISTREADERMANAGER_IID = Components.interfaces.sbIPlaylistReaderManager;
  35.  
  36. function CPlaylistReaderManager()
  37. {
  38.   jsLoader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"].getService(Components.interfaces.mozIJSSubScriptLoader);
  39.   jsLoader.loadSubScript( "chrome://rmp_demo/content/songbird_interfaces.js", this );
  40. }
  41.  
  42. CPlaylistReaderManager.prototype.constructor = CPlaylistReaderManager;
  43.  
  44. CPlaylistReaderManager.prototype = 
  45. {
  46.   originalURL: "",
  47.   
  48.   m_rootContractID: "@songbird.org/Songbird/Playlist/Reader/",
  49.   m_interfaceID: Components.interfaces.sbIPlaylistReader,
  50.   m_Browser: null,
  51.   m_Listener: null,
  52.  
  53.   GetTempFilename: function()
  54.   {
  55.     var strTempFile = "";
  56.     
  57.     var aDirectoryService = Components.classes["@mozilla.org/file/directory_service;1"].createInstance();
  58.     aDirectoryService = aDirectoryService.QueryInterface(Components.interfaces.nsIProperties);
  59.     
  60.     var aUUIDGenerator = (Components.classes["@mozilla.org/uuid-generator;1"]).createInstance();
  61.     aUUIDGenerator = aUUIDGenerator.QueryInterface(Components.interfaces.nsIUUIDGenerator);
  62.     var aUUID = aUUIDGenerator.generateUUID();
  63.     
  64.     var bResult = new Object;
  65.     var aTempFolder = aDirectoryService.get("DefProfLRt", Components.interfaces.nsIFile, bResult);
  66.     
  67.     aTempFolder.append(aUUID);
  68.     
  69.     return aTempFolder.path;
  70.   },
  71.   
  72.   GetFileExtension: function(strURL)
  73.   {
  74.     if(!strURL) return "";
  75.     
  76.     var aURL = Components.classes["@mozilla.org/network/standard-url;1"].createInstance(Components.interfaces.nsIURL);
  77.     var strExtension = "";
  78.     
  79.     try
  80.     {
  81.       aURL.spec = strURL;
  82.       strExtension = aURL.fileExtension;    
  83.     }
  84.     catch(err)
  85.     {
  86.       throw strURL + " - " + err;
  87.     }
  88.     
  89.     return strExtension;
  90.   },
  91.  
  92.   //sbIPlaylistReaderManager
  93.   LoadPlaylist: function(strURL, strGUID, strName, strReadableName, strPlaylistType, strDescription, strContentType, bAppendOrReplace, playlistReaderListener)
  94.   {
  95.     const PlaylistManager = new Components.Constructor("@songbird.org/Songbird/PlaylistManager;1", "sbIPlaylistManager");
  96.     const PlaylistReaderListener = new Components.Constructor("@songbird.org/Songbird/PlaylistReaderListener;1", "sbIPlaylistReaderListener");
  97.     
  98.     var err = new Object();
  99.     var theExtension = this.GetFileExtension(strURL);
  100.     var aLocalFile = (Components.classes["@mozilla.org/file/local;1"]).createInstance(Components.interfaces.nsILocalFile);
  101.     var aLocalURI = Components.classes["@mozilla.org/network/simple-uri;1"].createInstance(Components.interfaces.nsIURI);
  102.  
  103.     try
  104.     {
  105.       aLocalURI.spec = strURL;
  106.     }
  107.     catch ( err )
  108.     {
  109.       // WHOA!
  110. //      throw( "\r\nsbIPlaylistReaderManager::LoadPlaylist Error loading url '" + strURL + "'\r\n" + err + "\r\n" );
  111.       return false;
  112.     }
  113.     
  114.     if(aLocalURI.scheme == "file")
  115.     {
  116.       var aPlaylistManager = new PlaylistManager();
  117.       aPlaylistManager = aPlaylistManager.QueryInterface(Components.interfaces.sbIPlaylistManager);
  118.  
  119.       var aDBQuery = Components.classes["@songbird.org/Songbird/DatabaseQuery;1"].createInstance(Components.interfaces.sbIDatabaseQuery);
  120.       
  121.       aDBQuery.SetAsyncQuery(false);
  122.       aDBQuery.SetDatabaseGUID(strGUID);
  123.  
  124.       var playlist = aPlaylistManager.GetPlaylist(strName, aDBQuery);
  125.       
  126.       if(!playlist)
  127.         aPlaylistManager.CreatePlaylist(strName, strReadableName, strDescription, strPlaylistType, aDBQuery);
  128.         
  129.       err.value = 0;
  130.       
  131.       var aURL = Components.classes["@mozilla.org/network/standard-url;1"].createInstance(Components.interfaces.nsIURL);
  132.       aURL.spec = strURL;
  133.  
  134.       return this.Read(strURL, strGUID, strName, strContentType, bAppendOrReplace, err);
  135.     }
  136.     else 
  137.     {
  138.       // Remember the original url.
  139.       this.originalURL = strURL;
  140.       
  141.       var destFile = this.GetTempFilename() + "." + theExtension;
  142.       var aBrowser = (Components.classes["@mozilla.org/embedding/browser/nsWebBrowser;1"]).createInstance(Components.interfaces.nsIWebBrowserPersist);
  143.  
  144.       if(!aBrowser) return false;
  145.       this.m_Browser = aBrowser;      
  146.         
  147.         var aLocalFile = (Components.classes["@mozilla.org/file/local;1"]).createInstance(Components.interfaces.nsILocalFile);
  148.       aLocalFile.initWithPath(destFile);
  149.       
  150.       var aRegisterFileForDelete = Components.classes["@mozilla.org/uriloader/external-helper-app-service;1"].createInstance(Components.interfaces.nsPIExternalAppLauncher);
  151.       aRegisterFileForDelete.deleteTemporaryFileOnExit(aLocalFile);
  152.       
  153.       var aLocalURI = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService).newURI(strURL, null, null);
  154.               
  155.       if(playlistReaderListener)
  156.       {
  157.         this.m_Listener = playlistReaderListener;
  158.       }
  159.       else
  160.       {
  161.         var aListener = (new PlaylistReaderListener()).QueryInterface(Components.interfaces.sbIPlaylistReaderListener);
  162.         this.m_Listener = aListener;
  163.       }
  164.       
  165.       this.m_Listener.originalURL = this.originalURL;
  166.       this.m_Listener.serviceGuid = strGUID;
  167.       this.m_Listener.destinationURL = "file:///" + destFile;
  168.       this.m_Listener.destinationTable = strName;
  169.       this.m_Listener.readableName = strReadableName;
  170.       this.m_Listener.playlistType = strPlaylistType;
  171.       this.m_Listener.description = strDescription;
  172.       this.m_Listener.appendOrReplace = bAppendOrReplace;
  173.       
  174.       //this.m_Browser.persistFlags |= ENCODE_FLAGS_RAW;
  175.       this.m_Browser.progressListener = this.m_Listener;
  176.       
  177.       this.m_Browser.saveURI(aLocalURI, null, null, null, "", aLocalFile);
  178.  
  179.       return true;
  180.     }
  181.       
  182.     return true;
  183.   },
  184.  
  185.   AutoLoad: function(strURL, strGUID, strName, strType, strDesc, strContentType, playlistReaderListener)
  186.   {
  187.     var aUUIDGenerator = (Components.classes["@mozilla.org/uuid-generator;1"]).createInstance();
  188.     aUUIDGenerator = aUUIDGenerator.QueryInterface(Components.interfaces.nsIUUIDGenerator);
  189.  
  190.     var strDestTable = aUUIDGenerator.generateUUID();
  191.     
  192.     return this.LoadPlaylist(strURL, strGUID, strDestTable, strName, strType, strDesc, strContentType, false, playlistReaderListener);
  193.   },
  194.   
  195.   Read: function(strURL, strGUID, strDestTable, strContentType, bAppendOrReplace)
  196.   {
  197.     var theExtension = this.GetFileExtension(strURL);
  198.   
  199.     for(var contractID in Components.classes)
  200.     {
  201.       if(contractID.indexOf(this.m_rootContractID) != -1)
  202.       {
  203.         var aReader = Components.classes[contractID];
  204.         
  205.         aReader = aReader.createInstance();
  206.         aReader = aReader.QueryInterface(this.m_interfaceID);
  207.         
  208.         if(aReader)
  209.         {
  210.           if(strContentType == "")
  211.           {
  212.             var nExtensionsCount = new Object;
  213.             var theExtensions = aReader.SupportedFileExtensions(nExtensionsCount);
  214.             
  215.             for(var i = 0; i < theExtensions.length; i++)
  216.             {
  217.               if(theExtensions[i] == theExtension)
  218.               {
  219.                 var errorCode = new Object;
  220.                 var bRet = false;
  221.                 
  222.                 // Handoff the original url
  223.                 aReader.originalURL = this.originalURL;
  224.                 this.originalURL = "";
  225.                 
  226.                 bRet = aReader.Read(strURL, strGUID, strDestTable, bAppendOrReplace, errorCode);
  227.                 
  228.                 dump("CPlaylistReaderManager::Read (by extension: " + theExtensions[i] + ") - Last Attempt: " + bRet + "\n");
  229.                 
  230.                 if(bRet)
  231.                   return bRet;
  232.               }
  233.             }
  234.           }
  235.           else
  236.           {
  237.             var nMIMTypeCount = new Object;
  238.             var theMIMETypes = aReader.SupportedMIMETypes(nMIMTypeCount);
  239.             
  240.             for(var i = 0; i < theMIMETypes.length; i++)
  241.             {
  242.               if(theMIMETypes[i] == strContentType)
  243.               {
  244.                 var errorCode = new Object;
  245.                 var bRet = false;
  246.                 
  247.                 // Handoff the original url
  248.                 aReader.originalURL = this.originalURL;
  249.                 this.originalURL = "";
  250.                 
  251.                 bRet = aReader.Read(strURL, strGUID, strDestTable, bAppendOrReplace, errorCode);
  252.                 
  253.                 dump("CPlaylistReaderManager::Read (by mime type: " + theMIMETypes[i] + ") - Last Attempt: " + bRet + "\n");
  254.                 
  255.                 if(bRet)     
  256.                   return bRet;
  257.               }
  258.             }
  259.           }
  260.         }
  261.       }
  262.     }
  263.     
  264.     return false;
  265.   },
  266.   
  267.   SupportedFileExtensions: function(nExtCount)
  268.   {
  269.     var theExtensions = new Array;
  270.     nExtCount.value = 0;
  271.     
  272.     for(var contractID in Components.classes)
  273.     {
  274.       if(contractID.indexOf(this.m_rootContractID) != -1)
  275.       {
  276.         var aReader = Components.classes[contractID];
  277.      
  278.         aReader = aReader.createInstance();
  279.         aReader = aReader.QueryInterface(this.m_interfaceID);
  280.         
  281.         if(aReader)
  282.         {
  283.           var nExtensionsCount = new Object;
  284.           var aExts = aReader.SupportedFileExtensions(nExtensionsCount);
  285.           theExtensions.push(aExts);
  286.         }
  287.       }
  288.     }
  289.  
  290.     nExtCount.value = theExtensions.length;    
  291.     return theExtensions;
  292.   },
  293.   
  294.   SupportedMIMETypes: function(nMIMECount)
  295.   {
  296.     var theMIMETypes = new Array;
  297.     nMIMECount.value = 0;
  298.     
  299.     for(var contractID in Components.classes)
  300.     {
  301.       if(contractID.indexOf(this.m_rootContractID) != -1)
  302.       {
  303.         var aReader = Components.classes[contractID];
  304.      
  305.         aReader = aReader.createInstance();
  306.         aReader = aReader.QueryInterface(this.m_interfaceID);
  307.         
  308.         if(aReader)
  309.         {
  310.           var nMIMETypesCount = new Object;
  311.           var aMIMETypes = aReader.SupportedMIMETypes(nMIMETypesCount);
  312.           theMIMETypes.push(aMIMETypes);
  313.         }
  314.       }
  315.     }
  316.  
  317.     nMIMECount.value = theMIMETypes.length;    
  318.     return theMIMETypes;   
  319.   },
  320.   
  321.   QueryInterface: function(aIID) {
  322.     if (!aIID.equals(Components.interfaces.sbIPlaylistReaderManager) &&
  323.         !aIID.equals(Components.interfaces.nsISupports)) 
  324.     {
  325.       throw Components.results.NS_ERROR_NO_INTERFACE;
  326.     }
  327.     
  328.     return this;
  329.   }
  330. };
  331.  
  332. /**
  333.  * \class sbPlaylistReaderManagerModule
  334.  * \brief 
  335.  */
  336. var sbPlaylistReaderManagerModule = 
  337. {
  338.   registerSelf: function(compMgr, fileSpec, location, type)
  339.   {
  340.       compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
  341.       compMgr.registerFactoryLocation(SONGBIRD_PLAYLISTREADERMANAGER_CID, 
  342.                                       SONGBIRD_PLAYLISTREADERMANAGER_CLASSNAME, 
  343.                                       SONGBIRD_PLAYLISTREADERMANAGER_CONTRACTID,
  344.                                       fileSpec, 
  345.                                       location,
  346.                                       type);
  347.   },
  348.  
  349.   getClassObject: function(compMgr, cid, iid) 
  350.   {
  351.       if (!cid.equals(SONGBIRD_PLAYLISTREADERMANAGER_CID))
  352.           throw Components.results.NS_ERROR_NO_INTERFACE;
  353.  
  354.       if (!iid.equals(Components.interfaces.nsIFactory))
  355.           throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
  356.  
  357.       return sbPlaylistReaderManagerFactory;
  358.   },
  359.  
  360.   canUnload: function(compMgr)
  361.   { 
  362.     return true; 
  363.   }
  364. }; //sbPlaylistReaderManagerModule
  365.  
  366. /**
  367.  * \class sbPlaylistReaderManagerFactory
  368.  * \brief 
  369.  */
  370. var sbPlaylistReaderManagerFactory =
  371. {
  372.     createInstance: function(outer, iid)
  373.     {
  374.         if (outer != null)
  375.             throw Components.results.NS_ERROR_NO_AGGREGATION;
  376.     
  377.         if (!iid.equals(SONGBIRD_PLAYLISTREADERMANAGER_IID) &&
  378.             !iid.equals(Components.interfaces.nsISupports))
  379.             throw Components.results.NS_ERROR_INVALID_ARG;
  380.  
  381.         return (new CPlaylistReaderManager()).QueryInterface(iid);
  382.     }
  383. }; //sbPlaylistReaderManagerFactory
  384.  
  385. /**
  386.  * \function NSGetModule
  387.  * \brief 
  388.  */
  389. function NSGetModule(comMgr, fileSpec)
  390.   return sbPlaylistReaderManagerModule;
  391. } //NSGetModule